#pragma once

#include <iostream>
#include <string.h>
#include <assert.h>

using namespace std ;

// 模拟实现string类
// 要注意使用命名空间域避免冲突
// 使用size_t来与接口规范

namespace gojo
{

    class string
    {

        public:

            // 迭代器的声明

            typedef char* iterator ;

            typedef const char* const_iterator ;

            iterator begin () ;

            iterator end () ;

            const_iterator begin () const ;

            const_iterator end () const ;


        //默认函数

            string (const char* str = "") ;

            string (const string& str) ;

            ~string () ;


        // 增

            void push_back (char ch) ;

            void append (const char* str) ;

            string& operator += (char ch) ;

            string& operator += (const char* ch) ;

            string& insert (size_t pos , char ch) ;

            string& insert (size_t pos , const char* str) ;


        // 删

            void pop_back () ;

            string& erase (size_t pos = 0 , size_t len = npos) ;

            void clear () ;


        // 改

            // 扩容函数

            void reserve (size_t n) ;

            // string& operator = (const string& s) ;

            string& operator = (string s) ;

            char& operator [] (size_t i) ;

            const char& operator [] (size_t i) const ;

            // 交换函数

            void swap (string& str) ;


        // 查

            const char* c_str () const ;

            size_t size () const ;

            size_t find (char ch , size_t pos = 0) const ;
            
            size_t find (const char* str , size_t pos = 0) const ;

            string substr (size_t pos , size_t len = npos) const ;

        
        // 比较

            bool operator < (const string& s) const ;

            bool operator <= (const string& s) const ;

            bool operator > (const string& s) const ;

            bool operator >= (const string& s) const ;

            bool operator == (const string& s) const ;

            bool operator != (const string& s) const ;


        private:
            
            char* _str = nullptr ; // 这里的NULL为c++区分所变更的版本

            size_t _size = 0 ; 

            size_t _capacity = 0 ;
            

        public:

            static const size_t npos ;

    } ;

    void swap (string& x , string& y) ;

    ostream& operator << (ostream& out , const string& s) ;

    istream& operator >> (istream& in , string& s) ;

    istream& getline (istream& in , string& s , char delim = '\n') ;

}